home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / messenger_ms03-043.nasl < prev    next >
Text File  |  2005-01-14  |  10KB  |  334 lines

  1. #
  2. # This script is (C) Tenable Network Security
  3. # 10/22/2003 updated by KK Liu 10/22/2003
  4. #     - check messenger service, if not on - exit
  5. #    - check Windows OS 
  6. #
  7.  
  8. if(description)
  9. {
  10.  script_id(11890);
  11.  script_bugtraq_id(8826);
  12.  if(defined_func("script_xref"))script_xref(name:"IAVA", value:"2003-A-0028");
  13.  script_version("$Revision: 1.11 $");
  14.  script_cve_id("CAN-2003-0717");
  15.  
  16.  name["english"] = "Buffer Overrun in Messenger Service (real test)";
  17.  
  18.  script_name(english:name["english"]);
  19.  
  20.  desc["english"] = "
  21. A security vulnerability exists in the Messenger Service that could allow 
  22. arbitrary code execution on an affected system. An attacker who successfully 
  23. exploited this vulnerability could be able to run code with Local System 
  24. privileges on an affected system, or could cause the Messenger Service to fail.
  25. Disabling the Messenger Service will prevent the possibility of attack. 
  26.  
  27. This plugin actually checked for the presence of this flaw.
  28.  
  29. Solution : see http://www.microsoft.com/technet/security/bulletin/ms03-043.mspx
  30.  
  31. Risk factor : High";
  32.  
  33.  script_description(english:desc["english"]);
  34.  
  35.  summary["english"] = "Checks for hotfix Q828035";
  36.  
  37.  script_summary(english:summary["english"]);
  38.  
  39.  script_category(ACT_GATHER_INFO);
  40.  
  41.  script_copyright(english:"This script is Copyright (C) 2003 Tenable Network Security");
  42.  family["english"] = "Windows";
  43.  script_family(english:family["english"]);
  44.  exit(0);
  45. }
  46.  
  47. #
  48. # The idea is to send a malformed message to the remote RPC
  49. # messenger service.
  50. # If the service is installed we receive an error message in return
  51. # If the service is not installed, we receive a RPC unknown_if message
  52. #
  53. # Nothing gets printed on the remote screen.
  54. # check messenger service, if not on - exit
  55.  
  56. debug = 0;
  57.  
  58. #if(!get_kb_item("SMB/messenger")) 
  59. #{
  60. #    if (debug) display("Messenger Service disabled!\n");
  61. #    exit(0);
  62. #}
  63.  
  64. function dcom_recv(socket)
  65. {
  66.  local_var buf, len;
  67.  
  68.  buf = recv(socket:socket, length:9);
  69.  if(strlen(buf) != 9)return NULL;
  70.  
  71.  len = ord(buf[8]);
  72.  buf += recv(socket:socket, length:len - 9);
  73.  return buf;
  74. }
  75.  
  76. function check_win9xme()
  77. {
  78.     chk[3] = raw_string (0x02,0x00,0x01,0x00);
  79.  
  80.     bindwinme = raw_string(
  81.     0x05,0x00,0x0b,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x53,0x53,0x56,0x41,
  82.     0xd0,0x16,0xd0,0x16,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
  83.     0xe6,0x73,0x0c,0xe6,0xf9,0x88,0xcf,0x11,0x9a,0xf1,0x00,0x20,0xaf,0x6e,0x72,0xf4,
  84.     0x02,0x00,0x00,0x00,0x04,0x5d,0x88,0x8a,0xeb,0x1c,0xc9,0x11,0x9f,0xe8,0x08,0x00,
  85.     0x2b,0x10,0x48,0x60,0x02,0x00,0x00,0x00
  86.     );
  87.  
  88.     soc = open_sock_tcp(port);
  89.     if(soc)
  90.     {
  91.         send(socket:soc,data:bindwinme);
  92.             rwinme  = dcom_recv(socket:soc);
  93.             if(!strlen(rwinme))exit(0);
  94.         lenwinme = strlen(rwinme);
  95.         stubwinme = substr(rwinme, lenwinme-24, lenwinme-21);
  96.         if (debug)
  97.         {
  98.             display('len = ', lenwinme, '\n');
  99.             display('stub  = ', hexstr(stubwinme), '\n');
  100.             display('r = ', hexstr(rwinme), '\n');
  101.         }
  102.         if (stubwinme >< chk[3])
  103.         {
  104.             if (debug) display("Windows 95/98/ME not affected!\n");
  105.             exit(0);
  106.         }
  107.         close(soc);
  108.     }
  109.     else exit(0);
  110. }
  111.  
  112.  
  113. function check_XP()
  114. {
  115.     bindxp = raw_string( 
  116.     0x05, 0x00, 0x0b, 0x03, 0x10, 0x00, 0x00, 0x00,
  117.     0xcc, 0x00, 0x00, 0x00, 0x84, 0x67, 0xbe, 0x18,
  118.     0x31, 0x14, 0x5c, 0x16, 0x00, 0x00, 0x00, 0x00,
  119.     0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
  120.     0xb8, 0x4a, 0x9f, 0x4d, 0x1c, 0x7d, 0xcf, 0x11,
  121.     0x86, 0x1e, 0x00, 0x20, 0xaf, 0x6e, 0x7c, 0x57,
  122.     0x00, 0x00, 0x00, 0x00, 0x04, 0x5d, 0x88, 0x8a,
  123.     0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00,
  124.     0x2b, 0x10, 0x48, 0x60, 0x02, 0x00, 0x00, 0x00,
  125.     0x02, 0x00, 0x01, 0x00, 0xa0, 0x01, 0x00, 0x00,
  126.     0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
  127.     0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00,
  128.     0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11,
  129.     0x9f, 0xe8, 0x08, 0x00, 0x2b, 0x10, 0x48, 0x60,
  130.     0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
  131.     0x0a, 0x42, 0x24, 0x0a, 0x00, 0x17, 0x21, 0x41,
  132.     0x2e, 0x48, 0x01, 0x1d, 0x13, 0x0b, 0x04, 0x4d,
  133.     0x00, 0x00, 0x00, 0x00, 0x04, 0x5d, 0x88, 0x8a,
  134.     0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00,
  135.     0x2b, 0x10, 0x48, 0x60, 0x02, 0x00, 0x00, 0x00,
  136.     0x04, 0x00, 0x01, 0x00, 0xb0, 0x01, 0x52, 0x97,
  137.     0xca, 0x59, 0xcf, 0x11, 0xa8, 0xd5, 0x00, 0xa0,
  138.     0xc9, 0x0d, 0x80, 0x51, 0x00, 0x00, 0x00, 0x00,
  139.     0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11,
  140.     0x9f, 0xe8, 0x08, 0x00, 0x2b, 0x10, 0x48, 0x60,
  141.     0x02, 0x00, 0x00, 0x00 );
  142.     
  143.     
  144.     req = raw_string (
  145.     0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
  146.     0xaa, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41,
  147.     0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  148.     0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
  149.     0x00, 0x00, 0x00, 0x00, 0x28, 0x63, 0x29, 0x20,
  150.     0x75, 0x65, 0x72, 0x84, 0x20, 0x73, 0x73, 0x53,
  151.     0x20, 0x82, 0x80, 0x67, 0x00, 0x00, 0x00, 0x00,
  152.     0x80, 0x1d, 0x94, 0x5e, 0x96, 0xbf, 0xcd, 0x11,
  153.     0xb5, 0x79, 0x08, 0x00, 0x2b, 0x30, 0xbf, 0xeb,
  154.     0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
  155.     0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
  156.     0x5c, 0x00, 0x5c, 0x00, 0x41, 0x00, 0x00, 0x00,
  157.     0x41, 0x00, 0x41, 0x00, 0x5c, 0x00, 0x43, 0x00,
  158.     0x24, 0x00, 0x5c, 0x00, 0x41, 0x00, 0x2e, 0x00,
  159.     0x74, 0x00, 0x78, 0x00, 0x74, 0x00, 0x00, 0x00,
  160.     0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  161.     0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
  162.     0x58, 0x73, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x00,
  163.     0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  164.     0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
  165.     0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  166.     0x07, 0x00 );
  167.  
  168.  
  169.  
  170.  
  171.     soc = open_sock_tcp(port);
  172.     if(soc)
  173.     {
  174.         send(socket:soc,data:bindxp);
  175.         recv  = dcom_recv(socket:soc);
  176.         if(!strlen(recv))exit(0);
  177.         send(socket:soc,data:req);
  178.         recv  = dcom_recv(socket:soc);
  179.         if(!strlen(recv))exit(0);
  180.              
  181.         len = strlen(recv);
  182.         if (debug)
  183.         {
  184.             display('len = ', len, '\n');
  185.         }
  186.         if (len == 32)
  187.         {
  188.             if (debug) display("Windows XP found!\n");
  189.             close(soc);
  190.             return (1);
  191.         }
  192.         close(soc);
  193.         return (0);
  194.     }
  195.     else exit(0);
  196. }
  197.  
  198. function check_NT2K()
  199. {
  200.     bindNT2K = raw_string( 
  201.     0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,
  202.     0x00,0x00,0x7F,0x00,0x00,0x00,0xD0,0x16,0xD0,0x16,0x00,0x00,0x00,0x00,0x01,0x00,
  203.     0x00,0x00,0x01,0x00,0x01,0x00,0xA0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,
  204.     0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x04,0x5D,0x88,0x8a,0xEB,0x1C,
  205.     0xC9,0x11,0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00);
  206.     
  207.     
  208.     req = raw_string (
  209.     0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00,
  210.     0xaa, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41,
  211.     0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  212.     0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
  213.     0x00, 0x00, 0x00, 0x00, 0x28, 0x63, 0x29, 0x20,
  214.     0x75, 0x65, 0x72, 0x84, 0x20, 0x73, 0x73, 0x53,
  215.     0x20, 0x82, 0x80, 0x67, 0x00, 0x00, 0x00, 0x00,
  216.     0x80, 0x1d, 0x94, 0x5e, 0x96, 0xbf, 0xcd, 0x11,
  217.     0xb5, 0x79, 0x08, 0x00, 0x2b, 0x30, 0xbf, 0xeb,
  218.     0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
  219.     0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
  220.     0x5c, 0x00, 0x5c, 0x00, 0x41, 0x00, 0x00, 0x00,
  221.     0x41, 0x00, 0x41, 0x00, 0x5c, 0x00, 0x43, 0x00,
  222.     0x24, 0x00, 0x5c, 0x00, 0x41, 0x00, 0x2e, 0x00,
  223.     0x74, 0x00, 0x78, 0x00, 0x74, 0x00, 0x00, 0x00,
  224.     0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  225.     0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
  226.     0x58, 0x73, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x00,
  227.     0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  228.     0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
  229.     0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  230.     0x07, 0x00 );
  231.  
  232.  
  233.     soc = open_sock_tcp(port);
  234.     if(soc)
  235.     {
  236.         send(socket:soc,data:bindNT2K);
  237.         recv  = dcom_recv(socket:soc);
  238.         if(!strlen(recv))exit(0);
  239.         send(socket:soc,data:req);
  240.         recv  = dcom_recv(socket:soc);
  241.         if(!strlen(recv))exit(0);
  242.              
  243.         len = strlen(recv);
  244.         if (debug)
  245.         {
  246.             display('len = ', len, '\n');
  247.         }
  248.         if (len == 32)
  249.         {
  250.             if (debug) display("Windows NT found! Probe not avaiable yet!\n");
  251.             close(soc);
  252.             #exit(0);
  253.         return (1);
  254.         }
  255.         else
  256.         {
  257.              if (debug) display("Windows 2000 found!\n");       
  258.         }
  259.         close(soc);
  260.         return (1);
  261.     }
  262.     else exit(0);
  263. }
  264.  
  265. function check_winos()
  266. {
  267.     port = 135;
  268.     if(!get_port_state(port))
  269.     {
  270.      port = 593;
  271.     }
  272.     else
  273.     {
  274.      soc = open_sock_tcp(port);
  275.      if(!soc)port = 593;
  276.      else close(soc);
  277.     }
  278.     
  279.     check_win9xme();
  280.     check_XP();
  281.     check_NT2K();
  282. }
  283.  
  284. function check_rpc_serv()
  285. {
  286. seq1 = rand() % 256;
  287. seq2 = rand() % 256;
  288.  
  289.  
  290. sport = 2048 + rand() % 4096;
  291.  
  292. req = raw_string(0x04, 0x00, 0x28, 0x00, 0x10, 0x00, 
  293.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  294.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  295.     0x00, 0x00, 0xf8, 0x91, 0x7b, 0x5a, 0x00, 0xff,
  296.     0xd0, 0x11, 0xa9, 0xb2, 0x00, 0xc0, 0x4f, 0xb6,
  297.     0xe6, 0xfc, 0x04, 0x00, seq1, seq2, 0x03, 0x04,
  298.     0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0c,
  299.       0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 
  300.     0x00, 0x00, seq1, seq2, 0x00, 0x00, 0x00, 0x00,
  301.     0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00,
  302.     0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
  303.     0x00, 0x00, 0x08, 0x00, 0x00, 0x00) + "TENABLE" +
  304.     raw_string(0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  305.     0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  306.     0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
  307.     0x00, 0x00, 0x03, 0x00, 0x00, 0x00) + "tst" + raw_string(0) ;
  308.       
  309.     
  310. ip = forge_ip_packet(ip_hl : 5, ip_v: 4,  ip_tos:0, ip_len:20, ip_id:rand(), ip_off:0, ip_ttl:64, ip_p:IPPROTO_UDP, ip_src:this_host());
  311.  
  312. myudp = forge_udp_packet(ip:ip, uh_sport:sport, uh_dport:135, uh_ulen: 8 + strlen(req), data:req);
  313. filter = 'udp and dst port ' + sport + ' and src host ' + get_host_ip();
  314.  
  315. for(i=0;i<5;i++)
  316. {
  317.  rep = send_packet(myudp, pcap_active:TRUE, pcap_filter:filter, pcap_timeout:1);
  318.  if(rep)
  319.  {
  320.   sport = get_udp_element(udp:rep, element:"uh_sport");
  321.   if ( sport == 135 ) exit(0);
  322.   data = get_udp_element(udp:rep, element:"data");
  323.   code = substr(data, strlen(data) - 4, strlen(data) - 1);
  324.   if("f7060000" >< hexstr(code) || 
  325.      "0300011c" >< hexstr(code)){ security_hole(port:135, proto:"udp"); exit(0);}
  326.   break;
  327.   }
  328.  }
  329. }
  330.  
  331. check_winos();
  332. check_rpc_serv();
  333.